package com.array;

import java.io.*;

/**
 *@author:wzj
 *@Date:2019/11/16 14:00
 *@EML:15934369823@163.com
 *@explain:普通的二维数组转稀疏数组(五子棋案例)
 *
 *
 * 数据结构分为线性结构和非线性结构
 * 线性结构:数组,队列,链表,栈
 * 非线性结构:二维数组,树
 *
 * 线性结构:顺序结构和链式结构
 *      顺序结构:数组
 *      链式结构:链表
 *
 */
public class TwoArray {
    public static void main(String[] args) {
        //创建一个棋盘,0代表没有棋子,1代表黑棋,2代表白棋
        int arr[][] = new int[11][11];
        arr[1][2]=1; //黑棋
        arr[2][3]=2; //白棋
        System.out.println("原始的二维数组");
        for (int[] array : arr) {
            for (int i : array) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }

        //获取总共有多少个非0数组
        int count=0;
        for (int i=0;i<11;i++){
            for (int j=0;j<11;j++){
                if(arr[i][j]!=0){
                    count++;
                }
            }
        }
        System.out.println("非0的数总共有:"+count);
        System.out.println("-----------------------------");
        System.out.println("稀疏数组");
        //定义一个稀疏数组
        /**
         * 原始数组            稀疏数组                          第一个数行              第二行列数                   第三行列数
         * 0 0 0 0 0    ==>  第一行记录总共需要多少行和列非0的数据:   3                       5                       非0的数据有几个
         * 0 1 0 0 0    ==>                                    (第几行) 1              (第几列) 1                 (值)1
         * 0 0 2 0 0    ==>
         */
        //count+1是因为有多少个非0的数据,+1是第一行放的不是有效数据
        int sparseArray[][] = new int[count+1][3];
        //设置第一行第一列的数据,总共的行数
        sparseArray[0][0]=11;
        //设置第一行第二列的数据,总共的列数
        sparseArray[0][1]=11;
        //设置第一行第三列的数据,非0的数据
        sparseArray[0][2]=count;
        //将非0的数据转到稀疏数组中
        int con=0;
        for (int i=0;i<11;i++){  //行
            for (int j=0;j<11;j++){  //列
                if(arr[i][j]!=0){
                    con++;
                    sparseArray[con][0]=i;
                    sparseArray[con][1]=j;
                    sparseArray[con][2]=arr[i][j];
                }
            }
        }
        System.out.println("将稀疏数组输出到文件中");
        String path="D:\\array\\array.txt";
        File file = new File(path);
        FileOutputStream fileOutputStream=null;
        if(!file.exists()){
            try {
                file.createNewFile();
                fileOutputStream = new FileOutputStream(file);
                for (int i=0;i<sparseArray.length;i++){
                    StringBuffer stringBuffer = new StringBuffer();
                    stringBuffer.append(sparseArray[i][0]+"\t"+sparseArray[i][1]+"\t"+sparseArray[i][2]+"\n");
                    fileOutputStream.write(stringBuffer.toString().getBytes());
                }

            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        System.out.println("稀疏数组输出完成");
        for (int i=0;i<sparseArray.length;i++){
            System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }
        System.out.println("--------------------------------");
        System.out.println("稀疏数组转化为二维数组");
        //将稀疏数组中的大小赋值给新创的数组
        int twoArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i=1;i<sparseArray.length;i++){
            //将稀疏数组中的数据赋值给新数组中
            twoArray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }
        for (int[] array : twoArray) {
            for (int i : array) {
                System.out.printf("%d\t",i);
            }
            System.out.println();
        }
    }
}
